// Grunt 的入口文件
const sass = require('sass');
const loadGruntTasks = require('load-grunt-tasks');

module.exports = (grunt) => {
  // grunt 配置
  grunt.initConfig({
    a: 'aaa',
    b: {
      bb: 'bbb',
    },
    build: {
      options: {
        foo: 111,
      },
      // build:css
      css: {
        options: {
          // 会覆盖options中的同名属性
          foo: 222,
        },
      },
      // build:js
      js: 2,
    },
    clean: {
      temp: 'temp/**',
    },
    sass: {
      options: {
        sourceMap: true,
        implementation: sass,
      },
      main: {
        files: {
          'src/Engineering/css/style.css': 'src/Engineering/scss/main.scss',
        },
      },
    },
    babel: {
      options: {
        sourceMap: true,
        presets: ['@babel/preset-env'],
      },
      main: {
        files: {
          'src/Engineering/js/index.js': 'src/Engineering/es6/index.js',
        },
      },
    },
    watch: {
      js: {
        files: ['src/Engineering/es6/*.js'],
        tasks: ['babel'],
      },
      css: {
        files: ['src/Engineering/scss/*.scss'],
        tasks: ['sass'],
      },
    },
  });
  // yarn grunt task_001
  grunt.registerTask('task_001', () => {
    console.log('this is task_001');
  });

  // yarn grunt task_002
  grunt.registerTask('task_002', 'task description', () => {
    console.log('this is task_002');
  });

  // 默认任务
  // yarn grunt
  // grunt.registerTask('default', () => {
  //   console.log('hello grunt');
  // })
  // 从左至右依次执行
  // NOTE 数组中任务任意一个标记失败都会中断
  // 如果失败后强制继续执行 需要添加 --force 参数
  grunt.registerTask('default', ['sass', 'babel', 'watch']);

  // 异步任务
  grunt.registerTask('task_async', function () {
    const done = this.async();
    setTimeout(() => {
      console.log('async task done');
      done();
      // 异步任务标记失败
      // done(false)
    }, 1000);
  });

  // 标记失败
  grunt.registerTask('task_003', () => {
    console.log('this is task_001');
    return false;
  });

  // 使用配置项
  grunt.registerTask('task_004', function () {
    const a = grunt.config('a');
    const b = grunt.config('b.bb');
    console.log('this is task_004');
    console.log('a', a);
    console.log('b', b);
  });

  // 多目标任务
  grunt.registerMultiTask('build', function () {
    const options = this.options();
    console.log('this is build');
    console.log('target:', this.target);
    console.log('data:', this.data);
    console.log('options:', options);

    // Running "build:css" (build) task
    // this is build
    // target: css
    // data: { options: { foo: 222 } }
    // options: { foo: 222 }

    // Running "build:js" (build) task
    // this is build
    // target: js
    // data: 2
    // options: { foo: 111 }
  });

  // // grunt-contrib-clean 插件
  // grunt.loadNpmTasks('grunt-contrib-clean')

  // // grunt-sass 插件
  // grunt.loadNpmTasks('grunt-sass')

  // // grunt-babel 插件
  // grunt.loadNpmTasks('grunt-babel')

  // 自动加载 grunt 中所有的插件
  loadGruntTasks(grunt);
};
